package jk.zmn.sorm.core;

import jk.zmn.sorm.bean.ColumnInfo;
import jk.zmn.sorm.bean.TableInfo;
import jk.zmn.sorm.utils.JavaFileUtils;
import jk.zmn.sorm.utils.StringUtils;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 张梦楠
 * @简书：https://www.jianshu.com/u/d611be10d1a6
 * @码云：https://gitee.com/zhangqiye/events
 * @Date: 2018/6/15
 *
 *  负责获取数据库的表结构和类结构的关系，并可以根据表结构生成类结构，
 *
 **/
public class TableContext {

    /**
     * 表名为key，表信息对象为value
     */
    public static Map<String,TableInfo> tables = new HashMap<String,TableInfo>();

    /**
     * 将po的class对象和表信息对象关联起来，便于重用！
     */
    public static  Map<Class,TableInfo>  poClassTableMap = new HashMap<Class,TableInfo>();

    private TableContext(){}

    static {
        try {
            //初始化获得表的信息
            Connection con = DBManager.getConnection();
            DatabaseMetaData dbmd = con.getMetaData();

            ResultSet tableRet = dbmd.getTables(null, "%","%",new String[]{"TABLE"});

            while(tableRet.next()){
                String tableName = (String) tableRet.getObject("TABLE_NAME");

                TableInfo ti = new TableInfo(tableName,
                        new HashMap<String, ColumnInfo>(),new ArrayList<ColumnInfo>());
                tables.put(tableName, ti);

                ResultSet set = dbmd.getColumns(null, "%", tableName, "%");  //查询表中的所有字段
                while(set.next()){
                    ColumnInfo ci = new ColumnInfo(set.getString("COLUMN_NAME"),
                            set.getString("TYPE_NAME"), 0);
                    ti.getColumns().put(set.getString("COLUMN_NAME"), ci);
                }

                ResultSet set2 = dbmd.getPrimaryKeys(null, "%", tableName);  //查询t_user表中的主键
                while(set2.next()){
                    ColumnInfo ci2 = (ColumnInfo) ti.getColumns().get(set2.getObject("COLUMN_NAME"));
                    ci2.setKeyType(1);  //设置为主键类型
                    ti.getPriKeys().add(ci2);
                }

                if(ti.getPriKeys().size()>0){  //取唯一主键。。方便使用。如果是联合主键。则为空！
                    ti.setOnlyPriKey(ti.getPriKeys().get(0));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }


        //生成java文件
        //updatePoFile();
    }

    /**
     *  根据数据库表结构生成pojo类
     */
    public static void updatePoFile(){
        JavaFileUtils.createJavaFileToPackage();
    }
    /**
    *  加载完数据库中的表，生成pojo之后，把对应的类和对应的表关联起来
    * @date 2018/6/15 19:44
    * @param
    * @return void
    */
    public static void loadTablePoToMap(){

        for (TableInfo tableInfo : tables.values()){
            //实体类
            Class<?> aClass = null;
            try {
                aClass = Class.forName(DBManager.getConfiguration().getPackageName()
                        +"."+StringUtils.UpFirstString(tableInfo.getName()));
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            poClassTableMap.put(aClass,tableInfo);
        }
    }


}
